package reflect;

import java.lang.reflect.Field;

/*
1. 获取成员变量们
   - Field[] getFields() ：获取所有public修饰的成员变量
   - Field getField(String name)   获取指定名称的 public修饰的成员变量
   - Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
   - Field getDeclaredField(String name)
 2. 获取构造方法们
   - Constructor<?>[] getConstructors()
   - Constructor<T> getConstructor(类<?>... parameterTypes)
   - Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
   - Constructor<?>[] getDeclaredConstructors()
3. 获取成员方法们：
   - Method[] getMethods()
   - Method getMethod(String name, 类<?>... parameterTypes)
   - Method[] getDeclaredMethods()
   - Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4. 获取全类名
   - String getName()
 */
public class ReflectFields {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class personClass = Person.class;

        //Field[] getFields() ：获取所有public修饰的成员变量
        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println("   "+field);
        }

        //Field getField(String name)：获取指定名称的 public修饰的成员变量
        Field pub=personClass.getField("pub");
        System.out.println(pub);

        //获取成员变量的值
        Person person=new Person();
        Object value=pub.get(person);
        System.out.println("value = [" + value + "]");

        //设置pub的值
        pub.set(person,"KAKA");
        System.out.println("pub = [" + person.getPub() + "]");

        //Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
        Field[] declaredFields = personClass.getDeclaredFields();
        for (Field declaredField:declaredFields) {
            System.out.println("   "+declaredField);
        }

        // - Field getDeclaredField(String name)
        Field pri = personClass.getDeclaredField("pri");

        //忽略访问权限修饰符的安全检查：暴力反射
        pri.setAccessible(true);
        Object value2=pri.get(person);
        System.out.println("value2 = [" + value2 + "]");

    }
}
